const Bull = require('bull')

const { createBullBoard } = require('@bull-board/api')
const { BullAdapter } = require('@bull-board/api/bullAdapter')
const { KoaAdapter } = require('@bull-board/koa')


const { REDIS_HOST, REDIS_PORT } = require('../config/config_dev')
const { getAccessToken } = require('../api/wx_login')
const redis = require('./redis')

// 创建getwxtoken队列
const getTokenQueue = new Bull('get-wx-token-task', {
    redis: { host: REDIS_HOST, port: REDIS_PORT }, // Bull 使用的 Redis 连接
    defaultJobOptions: {
        removeOnComplete: true // 任务完成后自动删除
    }
})
// 添加重复任务（每2小时执行）
getTokenQueue.add(
    'get-wx-token-task', {},
    {
        repeat: {
            cron: '0 */1 * * *', // 一小时五十分钟执行一次
            // every: 10000,
            jobId: 'fixed-job-id',// 固定ID防止重复创建
            immediately: true // 首次立即执行
        },
        attempts: 3, // 失败后重试3次
        backoff: {
            type: 'fixed', // 固定间隔重试
            delay: 5000 // 每次重试间隔5秒
        }
    }
);
// 任务处理逻辑
getTokenQueue.process('get-wx-token-task', 10, async (job) => {
    try {
        //   console.log(`[${new Date()}] 开始执行任务 ${job.id}`);
        // 这里是你的业务逻辑
        const token = await getAccessToken()
        console.log("token", token);

        // 将结果存储到 Redis（使用 Hash 存储）
        await redis.hset(
            'wx_access_token',
            job.id,
            JSON.stringify({
                timestamp: Date.now(),
                data: JSON.stringify(token),
                status: 'completed'
            })
        )

        return { success: true }
    } catch (err) {
        // 错误结果存储
        await redis.hset(
            'wx_access_token',
            job.id,
            JSON.stringify({
                timestamp: Date.now(),
                error: err.message,
                status: 'failed'
            })
        )
        throw err
    }
})

getTokenQueue.on('completed', (job) => {
    console.log(`获取微信token任务 ${job.id} 已完成，结果：`, job.returnvalue)
})
    .on('failed', (job, err) => {
        console.error(`获取微信token任务 ${job.id} 失败，错误：`, err)
    })
    .on('waiting', (jobId) => {
        console.log(`获取微信token任务 ${jobId} 进入等待队列`)
    })



const serverAdapter = new KoaAdapter()
createBullBoard({
    queues: [new BullAdapter(getTokenQueue)],
    serverAdapter
})

module.exports = serverAdapter